Subroutine to calculate the distance between the units inside a kohonen layer
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=wp), | intent(inout), | dimension(:,:) | :: | coordinates | 
                 A real array  | 
        |
| real(kind=wp), | intent(inout), | dimension(:,:) | :: | distance_matrix | 
                 A real array  | 
        |
| character(len=*) | :: | grid_type | 
                 A character varaible  | 
        |||
| logical | :: | toroidal | 
                 A logical variableS  | 
        
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer, | public | :: | i | ||||
| integer, | public | :: | j | ||||
| real(kind=wp), | public | :: | maxdiffx | ||||
| real(kind=wp), | public | :: | maxdiffy | ||||
| real(kind=wp), | public | :: | maxdiffz | ||||
| real(kind=wp), | public, | dimension(3) | :: | diffs | 
subroutine calculate_distance_matrix(coordinates,distance_matrix,grid_type,toroidal) !======================================================================================== !! Subroutine to calculate the distance between the units inside a kohonen layer real(kind=wp),dimension(:,:),intent(inout) :: coordinates !! A real array real(kind=wp),dimension(:,:),intent(inout) :: distance_matrix !! A real array character(len=*) :: grid_type !! A character varaible logical :: toroidal !! A logical variableS integer :: i,j real(kind=wp) :: maxdiffx,maxdiffy,maxdiffz real(kind=wp),dimension(3) :: diffs ! maxdiffx=maxval(coordinates(:,1))/2.0_wp; maxdiffy=maxval(coordinates(:,2))/2.0_wp; maxdiffz=maxval(coordinates(:,3))/2.0_wp; ! if(toroidal) then do i=1,size(distance_matrix,1) do j=i+1,size(distance_matrix,2) diffs=abs(coordinates(j,1:3) - coordinates(i,1:3)); if (diffs(1) > maxdiffx) diffs(1)=2.0_wp*maxdiffx - diffs(1); if (diffs(2) > maxdiffy) diffs(2)=2.0_wp*maxdiffy - diffs(2); !if (diffs(3) > maxdiffy) diffs(3)=2*maxdiffz - diffs(3); if (trim(grid_type) .eq. "hexagonal") then distance_matrix(i,j)= sum(diffs**2); elseif(trim(grid_type) .eq. "rectangular") then !rectangular distance_matrix(i,j)=maxval(diffs); endif enddo enddo else do i=1,size(distance_matrix,1) do j=i+1,size(distance_matrix,2) diffs=abs(coordinates(j,1:3) - coordinates(i,1:3)); distance_matrix(i,j)=dsqrt(sum(diffs**2)); enddo enddo endif ! distance_matrix=distance_matrix + transpose(distance_matrix); !write(*,'(49f10.4)') distance_matrix(1,:) ! end subroutine calculate_distance_matrix